package com.dongdongshop.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dongdongshop.pojo.Cart;
import com.dongdongshop.pojo.TbItem;
import com.dongdongshop.pojo.TbOrderItem;
import com.dongdongshop.service.CartService;
import com.dongdongshop.service.TbItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Service
@com.alibaba.dubbo.config.annotation.Service
public class CartServiceImpl implements CartService {

    @Reference
    private TbItemService tbItemService;

    @Autowired
    private RedisTemplate redisTemplate;

    @Override
    public List<Cart> saveCart(List<Cart> cartList, Long itemId, Integer num) {
        // 1. 根据SKU id 查询 商品 SKU 的详情信息
        TbItem tbItem = tbItemService.selectItemId(itemId);
        // 2. 从 SKU 中获取商家ID
        String sellerId = tbItem.getSellerId();
        // 3. 判断购物车中是否有这个商家的ID
        Cart cart= getCartBySellerId(cartList, sellerId);
        if (cart == null){ // 3.1 如果没有 新增一个购物车
            // 3.1.2 然后把商品信息放入   再把这个购物车 追加进原来 的购物车中
            cart = new Cart();
            cart.setSellerId(sellerId);
            // 3.1.2 将要卖商品的明细 放入购物车的明细表中
            TbOrderItem orderItem  = createOrderItem(tbItem, num);

            // 3.1.3 创建明细列表 并将购物车明细 放入列表中
            List<TbOrderItem> orderItemList = new ArrayList<>();
            orderItemList.add(orderItem);

            // 3.1.4 将购物车明细列表 放入原来的列表中
            cart.setOrderItemList(orderItemList);

            // 3.1.5 将新的 和 原来的 合在一起
            cartList.add(cart);

        }else { // 3.2 如果有 获取原来商家的购物车
            // 3.2.1 判断这个商家的明细中 是否有要买的这件商品的明细  --?如果没有 就新增一个明细 追加到商家的购物车中
            TbOrderItem tbOrderItem = getOrderItemByItem(cart.getOrderItemList(), itemId);
            if (tbOrderItem == null){
                tbOrderItem = createOrderItem(tbItem, num);
                cart.getOrderItemList().add(tbOrderItem);
            }else {
                // 3.2.2 如果有这件商品 我们只需要修改 数量 和小计
                tbOrderItem.setNum(tbOrderItem.getNum() + num);
                // 3.2.3 修改总价格
                tbOrderItem.setPrice(new BigDecimal(tbOrderItem.getPrice().doubleValue() * tbOrderItem.getNum()));
                // 如果当前商品数量为0 ,要将它从购物车的明细中移除
                if (tbOrderItem.getNum().intValue() <= 0){
                    cart.getOrderItemList().remove(tbOrderItem);
                }
                // 如果当前 购物车列表 已经没有数据, 要将购物车从原购物车移除
                if (cart.getOrderItemList().size() <= 0){
                    cartList.remove(cart);
                }

            }
        }
        // 4. 返回购物车
        return cartList;
    }


    // 从rides 中查询购物车信息
    @Override
    public List<Cart> getCartListFormRedis(String name) {
        List<Cart> cartList = (List<Cart>) redisTemplate.boundHashOps("cartList").get(name);
        if (cartList == null){
            cartList = new ArrayList<>();
        }
        return cartList;
    }
    // 向redis 中存储购物车 明细
    @Override
    public void saveCartListRedis(List<Cart> cartList1, String username) {
        redisTemplate.boundHashOps("cartList").put(username,cartList1);
    }
    // 合并购物车
    @Override
    public List<Cart> merAgeCartList(List<Cart> cartRedisList, List<Cart> cartCookieList) {
        for (Cart cart : cartCookieList) {
            for (TbOrderItem orderItem : cart.getOrderItemList()) {
                cartRedisList = saveCart(cartRedisList,orderItem.getItemId(),orderItem.getNum());
            }
        }
        return cartRedisList;
    }

    // 判断购物集合中 是否存在该商家的购物车,如果有就返回购物车 没有就返回null
    private Cart getCartBySellerId(List<Cart> cartList,String sellerId){
        for (Cart cart : cartList) {
            if (Objects.equals(cart,sellerId)){
                return cart;
            }
        }
        return null;
    }
    // 判断 购物车明细中是否有该商品 如果存在就返回该商品,如偶不存在就返回null
    private TbOrderItem getOrderItemByItem(List<TbOrderItem> orderItemList,Long itemId){
        return orderItemList.stream().filter(orderItem -> Objects.equals(orderItem, itemId)).findFirst().orElse(null);
    }
    // 封装方法 组装购物车明细
    private TbOrderItem createOrderItem(TbItem tbItem,Integer num){
        TbOrderItem orderItem = new TbOrderItem();
        orderItem.setSellerId(tbItem.getSellerId());
        orderItem.setNum(num);
        orderItem.setItemId(tbItem.getId());
        orderItem.setGoodsId(tbItem.getGoodsId());
        orderItem.setTitle(tbItem.getTitle());
        orderItem.setPrice(tbItem.getPrice());
        orderItem.setPicPath(tbItem.getImage());
        orderItem.setTotalFee(new BigDecimal(num * tbItem.getPrice().doubleValue()));
        return orderItem;
    }
}
